Supplement 1. Systematic review

PRISMA flowchart

Donne moi les chiffres quand tu as fini, j’insèrerai

PRISMAstatement::prisma(found = 750,
       found_other = 123,
       no_dupes = 776, 
       screened = 776, 
       screen_exclusions = 13, 
       full_text = 763,
       full_text_exclusions = 17, 
       qualitative = 746, 
       quantitative = 319,
       width = 800, height = 1200)

Overall N studies + participants

dat_tot
## # A tibble: 1 x 3
##   n_studies n_nexp_out n_exp_out
##       <int>      <dbl>     <dbl>
## 1       143       8314      7997

N studies (adjustment discarded)

dat.borenstein %>%
    group_by(outcome_RDoC_agg) %>%
    summarise(n_exp = sum(n_exp),
              n_nexp = sum(n_nexp),
              nstudy1 = n(),
              n_study2 = length(unique(ID_study)))
## # A tibble: 4 x 5
##   outcome_RDoC_agg                      n_exp n_nexp nstudy1 n_study2
##   <chr>                                 <dbl>  <dbl>   <int>    <int>
## 1 Mixed social processes                 5847   5506      90       87
## 2 Reception of facial communication      2046   2120      47       44
## 3 Reception of non-facial communication   522    580      10        9
## 4 Understanding mental states            2766   2670      65       60

N studies (adjustment splitted)

synth_n = dat.borenstein %>%
    group_by(outcome_RDoC) %>%
    summarise(n_exp = sum(n_exp),
              n_nexp = sum(n_nexp),
              nstudy1 = n(),
              n_study2 = length(unique(ID_study)))
synth_n
## # A tibble: 8 x 5
##   outcome_RDoC                                      n_exp n_nexp nstudy1 n_stu~1
##   <chr>                                             <dbl>  <dbl>   <int>   <int>
## 1 Mixed social processes (adjusted)                   277    306       8       8
## 2 Mixed social processes (non-adjusted)              5570   5200      82      82
## 3 Reception of facial communication (adjusted)        425    650       7       7
## 4 Reception of facial communication (non-adjusted)   1621   1470      40      40
## 5 Reception of non-facial communication (adjusted)    171    326       3       3
## 6 Reception of non-facial communication (non-adjus~   351    254       7       7
## 7 Understanding mental states (adjusted)              245    274       9       9
## 8 Understanding mental states (non-adjusted)         2521   2396      56      56
## # ... with abbreviated variable name 1: n_study2

Supplement 2. ES visualization

Distribution of ES

ggplot(dat.meta, aes(x = es_adj, y = es)) + 
  geom_jitter(alpha = 0.3, width = 0.35, size = 2) +
    geom_violin(size = 0.5, alpha = 0.5) +
theme_bw() 

Distribution of ES / outcomes

2 plots, tu choisis celui qui tu préfères

ggplot(dat.meta, aes(x = outcome_RDoC_agg, y = es)) + 
       geom_jitter(width = 0.05, dotsize = 0.1, alpha = 0.2, aes(fill = ID)) +        geom_boxplot(trim=FALSE, alpha = 0.6) +
      facet_grid(es_adj ~ "") +
       theme_bw() +
      labs(y = "Standardized mean difference (SMD)", x = "") +
        guides(fill=FALSE) +
       coord_flip()

ggplot(dat.meta, aes(x = outcome_RDoC_agg, y = es)) + 
    geom_violin(aes(fill = outcome_RDoC_agg), alpha = 0.3) +
  geom_jitter(alpha = 0.2, width = 0.1) +
    geom_boxplot(width=0.1)+
    facet_grid(es_adj ~ "") +
    theme_bw() +
    labs(y = "Standardized mean difference (SMD)", x = "") +
    theme(text = element_text(size = 18),
          legend.position = "none",
          axis.title.y = element_text(size=12, face="bold"), 
          axis.title.x = element_text(size=12, face="bold")) +
    coord_flip()  


Supplement 3. Main analysis

Data analysis

V.SCE  <- with(dat.meta,
  clubSandwich::impute_covariance_matrix(
    vi = se^2, 
    cluster = ID_study, 
    r = 0.8,
    return_list = FALSE,
    smooth_vi = TRUE, 
    subgroup = outcome_RDoC))

# all.equal(dat.meta$se^2, diag(unlist(V.SCE)))

SCE <- metafor::rma.mv(yi = es, V = V.SCE, 
                       data = dat.meta, 
                       mods = ~ outcome_RDoC - 1,
                       random = ~ outcome_RDoC | ID_study,
                       struct = "DIAG",
                       sparse = TRUE)

SCE.ISQ <- metafor::rma.mv(yi = es, V = V.SCE, 
                       data = dat.meta, 
                       mods = ~ outcome_RDoC - 1)
het = function(x, y) {
  i2 = NA
  for (i in 1:nrow(vcov(x))) {
    i2[i] = 100 * (vcov(x)[i,i] - vcov(y)[i,i]) / vcov(x)[i,i]
  }
  return(i2)
}
# 
# W <- solve(V.SCE)
# X <- model.matrix(SCE)
# P <- W - W %*% X %*% solve(t(X) %*% W %*% X) %*% t(X) %*% W
# 100 * SCE$tau2 / (SCE$tau2 + (SCE$k-SCE$p)/sum(diag(P)))


res.SCE <- data.frame(clubSandwich::coef_test(SCE, vcov = "CR2", cluster = dat.meta$ID_study)) # , cluster = df.ES$researchgroup
res.SCE.ci = data.frame(clubSandwich::conf_int(SCE, vcov = "CR2", cluster = dat.meta$ID_study))
res.SCE$target <- gsub("outcome_RDoC", "", row.names(res.SCE))
res.SCE.ci$target <- gsub("outcome_RDoC", "", row.names(res.SCE.ci))
res.SCE = dplyr::left_join(res.SCE, res.SCE.ci)
res.SCE$I2 = het(SCE, SCE.ISQ)
res_main <- left_join(res.SCE, dat_RDoC)
## Joining, by = "target"
res_main[,c("beta", "SE", "tstat", "df", "p_Satt", "CI_L", "CI_U", "I2", "n_studies",    "n_nexp_out" , "n_exp_out")] <- apply(res_main[,c("beta", "SE", "tstat", "df", "p_Satt", "CI_L", "CI_U", "I2", "n_studies",    "n_nexp_out" , "n_exp_out")], 2, function(x) round(x, 3))
DT::datatable(res_main, 
              rownames = FALSE,
              extensions = 'Buttons',
              options = list(  # options
                buttons = c('copy', 'excel'),
                scrollX = TRUE,
                dom = c('ftB'), 
                autoWidth = TRUE,
                columnDefs = list(
                  list(className = 'dt-center', 
                                     targets = "_all"))))

Forest plot

res_main$SE_COR = (res_main$CI_U - res_main$CI_L) / 3.92

res_main$raw_outcome <- gsub(r"{\s*\([^\)]+\)}","",
                            as.character(res_main$outcome_RDoC))
tab.plot <- data.frame(
  Outcome = do.call(rbind, lapply(res_main$outcome_RDoC, 
                                  function(x) paste(strwrap(x, width = 60), 
                                                    collapse = "\n"))),
  n_ADHD = res_main$n_exp_out,
  n_nexpT = res_main$n_nexp_out,
  n_studies = res_main$n_studies,
  I2 = paste0(round(res_main$I2), "%"))

value_num_plot = data.frame(apply(res_main[, c("beta", "SE_COR")], 2, function(x) as.numeric(as.character(x))))

forest_modif(x = value_num_plot[ ,c("beta", "SE_COR")], 
           variant = "classic",
           col = "Greys", xlab = "SMD", annotate_CI = TRUE,
           study_table = tab.plot,
           group = res_main$raw_outcome,
           type = "study_only",
           text_size = 3.5,
           x_limit = c(-1, 2),
           N = tab.plot$n_ADHD + tab.plot$n_nexpT,
           x_breaks = seq(-3, 3, 1)
           )

Diagnostics

# windows() ## create window to plot your file
metafor::profile.rma.mv(SCE)
## Profiling tau2 = 1

## Profiling tau2 = 2

## Profiling tau2 = 3

## Profiling tau2 = 4

## Profiling tau2 = 5

## Profiling tau2 = 6

## Profiling tau2 = 7

## Profiling tau2 = 8

# dev.off()

Supplement 4. Supplementary analyses

S1. Borenstein aggregated approach

meta.reg <- metafor::rma.mv(yi = es, V = se^2, 
                           data = dat.borenstein, 
                           random = ~ outcome_RDoC | ID_study,
                           struct = "DIAG",
                           mods = ~ outcome_RDoC - 1)

res.S1.a.clean = data.frame(
  beta = meta.reg$beta,
  se = meta.reg$se,
  ci_lo = meta.reg$ci.lb,
  ci_up = meta.reg$ci.ub,
  pval = meta.reg$pval, 
  target = gsub("outcome_RDoC", "", row.names(meta.reg$b)))

res.S1 <- left_join(res.S1.a.clean, dat_RDoC)
## Joining, by = "target"
DT::datatable(res.S1, 
              rownames = FALSE,
              extensions = 'Buttons',
              options = list(  # options
                buttons = c('copy', 'excel'),
                scrollX = TRUE,
                dom = c('ftB'), 
                autoWidth = TRUE,
                columnDefs = list(
                  list(className = 'dt-center', 
                                     targets = "_all"))))

S2. RVE approach

robu.main <- robumeta::robu(es ~ outcome_RDoC - 1, 
                            data = dat.meta, 
                            studynum = ID_study,
                            var.eff.size = se^2,
                            modelweights = "CORR",
                            small = TRUE,
                            rho = 0.8)

dat_robu_main = data.frame(
  beta = robu.main$reg_table$b.r,
  se = robu.main$reg_table$SE,
  ci_lo = robu.main$reg_table$CI.L,
  ci_up = robu.main$reg_table$CI.U,
  pval = robu.main$reg_table$prob, 
  target = gsub("outcome_RDoC", "", row.names(meta.reg$b)),
  target2 = robu.main$reg_table$labels)

DT::datatable(dat_robu_main, 
              rownames = FALSE,
              extensions = 'Buttons',
              options = list(  # options
                buttons = c('copy', 'excel'),
                scrollX = TRUE,
                dom = c('ftB'), 
                autoWidth = TRUE,
                columnDefs = list(
                  list(className = 'dt-center', 
                                     targets = "_all"))))

SCE vs RVE vs Borenstein

res.SCE.main = data.frame(
    beta = res.SCE$beta,
    se = res.SCE$SE,
    ci_lo = res.SCE$CI_L,
    ci_up = res.SCE$CI_U,
    pval = res.SCE$p_Satt, 
    target =res.SCE$target)
res.SCE.main$Analysis = "SCE approach"
res.S1.a.clean$Analysis = "Borenstein approach"
dat_robu_main$Analysis = "RVE approach"
dat_forest_S1 = bind_rows(res.SCE.main,
                          res.S1.a.clean,
                          dat_robu_main)


meta_res_tot = meta::metagen(TE = beta, seTE = (ci_up-ci_lo)/(2*qnorm(.975)), 
                             sm = "SMD", data = dat_forest_S1,
                             subgroup = target, 
                             studlab = Analysis)

meta::forest(meta_res_tot, random = FALSE, fixed = FALSE, 
             leftcols = c("studlab"),
             text.subgroup.nohet = FALSE, print.tau2 = FALSE, print.I2 = FALSE, print.pval.Q = FALSE,
             plotwidth = "15cm", colgap.left = "1cm", colgap.right = "1cm",
             leftlabs= c(""),
             just = "right", spacing = 0.8)

S3. Small study effects & ESS

Nakaraga method

dat.meta$inv_n_tilda <- with(dat.meta, (n_nexp + n_exp)/(n_nexp*n_exp))
dat.meta$sqrt_inv_n_tilda <- with(dat.meta, sqrt(inv_n_tilda))

nak.pb = metafor::rma.mv(yi = es, V = V.SCE, 
                      data = dat.meta, 
                      mods = ~ 1 + sqrt_inv_n_tilda + outcome_RDoC,
                      random = ~ outcome_RDoC | ID_study,
                      struct = "DIAG",
                      sparse = TRUE)
clubSandwich::coef_test(nak.pb, vcov = "CR2", cluster = dat.meta$ID_study)
##                                                              Coef. Estimate
## 1                                                          intrcpt    0.112
## 2                                                 sqrt_inv_n_tilda    5.292
## 3                outcome_RDoCMixed social processes (non-adjusted)   -0.114
## 4         outcome_RDoCReception of facial communication (adjusted)   -0.708
## 5     outcome_RDoCReception of facial communication (non-adjusted)   -0.781
## 6     outcome_RDoCReception of non-facial communication (adjusted)   -0.684
## 7 outcome_RDoCReception of non-facial communication (non-adjusted)   -0.973
## 8               outcome_RDoCUnderstanding mental states (adjusted)   -0.854
## 9           outcome_RDoCUnderstanding mental states (non-adjusted)   -0.619
##      SE t-stat  d.f. p-val (Satt) Sig.
## 1 0.531  0.210  8.94      0.83829     
## 2 1.925  2.749 17.93      0.01323    *
## 3 0.257 -0.442  8.45      0.66948     
## 4 0.310 -2.283 11.65      0.04204    *
## 5 0.266 -2.940  9.52      0.01556    *
## 6 0.373 -1.835  3.92      0.14184     
## 7 0.272 -3.573  9.62      0.00539   **
## 8 0.316 -2.700  9.79      0.02272    *
## 9 0.259 -2.395  9.53      0.03881    *

PET-PEESE method (Stanley 2014)

PET = metafor::rma.mv(yi = es, V = V.SCE, 
                      data = dat.meta, 
                      mods = ~ se,
                      random = ~ outcome_RDoC | ID_study,
                      struct = "DIAG",
                      sparse = TRUE)
clubSandwich::coef_test(PET, vcov = "CR2", cluster = dat.meta$ID_study)
##     Coef. Estimate    SE t-stat d.f. p-val (Satt) Sig.
## 1 intrcpt    -2.89 0.453  -6.36 72.1       <0.001  ***
## 2      se    14.47 1.692   8.55 24.6       <0.001  ***
dat.meta$var = dat.meta$se^2
PET = metafor::rma.mv(yi = es, V = V.SCE, 
                      data = dat.meta, 
                      mods = ~ var,
                      random = ~ outcome_RDoC | ID_study,
                      struct = "DIAG",
                      sparse = TRUE)
clubSandwich::coef_test(PET, vcov = "CR2", cluster = dat.meta$ID_study)
##     Coef. Estimate    SE t-stat d.f. p-val (Satt) Sig.
## 1 intrcpt   -0.853 0.187  -4.56 73.7       <0.001  ***
## 2     var   23.488 2.455   9.57 19.2       <0.001  ***

Split by outcome : Egger’s test + ESS

dat_ess = data.frame(
  meta_review = "Haza",
  study = dat.borenstein$ID_study,
  factor = dat.borenstein$outcome_RDoC,
  value = dat.borenstein$es,
  se = dat.borenstein$se,
  n_cases = dat.borenstein$n_exp,
  n_controls = dat.borenstein$n_nexp,
  measure = "G")
  
umb = metaumbrella::umbrella(dat_ess)
## Analyzing factor: Understanding mental states (non-adjusted) 
## Analyzing factor: Mixed social processes (non-adjusted) 
## Analyzing factor: Mixed social processes (adjusted) 
## Analyzing factor: Understanding mental states (adjusted)
## - An error occured when converting the standard error of G to SMD. The standard error of the SMD was assumed to be equal to 'sqrt(1/n_cases + 1/n_controls)'.
## Analyzing factor: Reception of facial communication (non-adjusted) 
## Analyzing factor: Reception of non-facial communication (non-adjusted)
## - An error occured when converting the standard error of G to SMD. The standard error of the SMD was assumed to be equal to 'sqrt(1/n_cases + 1/n_controls)'.
## Analyzing factor: Reception of facial communication (adjusted) 
## Analyzing factor: Reception of non-facial communication (adjusted)
umb
## 
## Umbrella review:
##                                                 Factor n_studies total_n
## 1           Understanding mental states (non-adjusted)        56    4917
## 2                Mixed social processes (non-adjusted)        82   10770
## 3                    Mixed social processes (adjusted)         8     583
## 4               Understanding mental states (adjusted)         9     519
## 5     Reception of facial communication (non-adjusted)        40    3091
## 6 Reception of non-facial communication (non-adjusted)         7     605
## 7         Reception of facial communication (adjusted)         7    1075
## 8     Reception of non-facial communication (adjusted)         3     497
##   n_cases n_controls measure value       value_CI    eG          eG_CI   eOR
## 1    2521       2396       G 0.852 [0.686, 1.018] 0.852 [0.686, 1.018] 4.692
## 2    5570       5200       G 1.055 [0.909, 1.201] 1.055 [0.909, 1.201] 6.775
## 3     277        306       G 1.257 [0.607, 1.908] 1.257 [0.607, 1.908] 9.782
## 4     245        274       G 0.879 [0.455, 1.304] 0.879 [0.455, 1.304] 4.928
## 5    1621       1470       G 0.795   [0.63, 0.96] 0.795   [0.63, 0.96] 4.227
## 6     351        254       G 0.968 [0.525, 1.411] 0.968 [0.525, 1.411] 5.784
## 7     425        650       G 0.488 [0.262, 0.714] 0.488 [0.262, 0.714] 2.423
## 8     171        326       G 0.590 [0.008, 1.172] 0.590 [0.008, 1.172] 2.917
##            eOR_CI  p_value     I2           PI_eG          PI_eOR  egger_p
## 1  [3.473, 6.338] 7.20e-24 85.544 [-0.314, 2.019] [0.565, 38.942] 8.94e-01
## 2  [5.196, 8.835] 2.52e-45 88.429    [-0.2, 2.31] [0.695, 66.024] 1.29e-04
## 3 [3.008, 31.817] 1.51e-04 91.236 [-1.084, 3.598] [0.14, 683.241] 2.73e-01
## 4 [2.283, 10.638] 4.87e-05 79.000 [-0.607, 2.366] [0.332, 73.042] 1.45e-01
## 5  [3.133, 5.704] 4.08e-21 83.903 [-0.164, 1.753] [0.743, 24.048] 5.50e-01
## 6   [2.59, 12.92] 1.86e-05 82.754  [-0.515, 2.45] [0.393, 85.127] 8.53e-01
## 7  [1.608, 3.653] 2.37e-05 64.108  [-0.204, 1.18]  [0.691, 8.504] 8.47e-01
## 8  [1.015, 8.385] 4.69e-02 77.993 [-6.381, 7.561] [0, 904222.896] 7.65e-01
##      ESB_p power_med     JK_p   largest_CI_eG  largest_CI_eOR rob amstar
## 1 9.79e-01       100 8.30e-23 [-0.304, 0.449]  [0.576, 2.258]  NA     NA
## 2 1.10e-01       100 5.67e-44 [-0.154, 0.883]  [0.757, 4.957]  NA     NA
## 3 6.73e-01       100 1.53e-03  [0.623, 1.315] [3.095, 10.864]  NA     NA
## 4 3.78e-01       100 3.44e-04  [0.271, 0.939]  [1.634, 5.494]  NA     NA
## 5 7.93e-01       100 7.04e-20  [1.259, 1.804] [9.804, 26.348]  NA     NA
## 6 3.58e-01       100 6.06e-04  [0.967, 1.419] [5.776, 13.118]  NA     NA
## 7 4.38e-01       100 6.83e-04   [0.218, 1.22]   [1.484, 9.15]  NA     NA
## 8 4.14e-01       100 2.32e-01  [0.165, 0.879]  [1.348, 4.928]  NA     NA
# metaumbrella::umbrella(subset(dat_ess, factor == "Mixed social processes (non-adjusted)"))[[1]]$egger$p.value
# metafor::regtest(x = dat_sub$es, sei = dat_sub$se, model = "lm", predictor="sei")$pval

Plot

ggplot(dat.borenstein, aes(x=es, y=se)) + 
    geom_point(alpha = 0.2) + 
    geom_smooth(method="lm") + 
    facet_wrap(~outcome_RDoC, scales='free') +
    theme_bw()
## `geom_smooth()` using formula 'y ~ x'

S4. type of publication

SCE.S2 <- metafor::rma.mv(yi = es, V = V.SCE, 
                       data = dat.meta, 
                       mods = ~ type_publication - 1 + outcome_RDoC,
                       random = ~ outcome_RDoC | ID_study,
                       struct = "DIAG",
                       sparse = TRUE)

clubSandwich::coef_test(SCE.S2, vcov = "CR2", cluster = dat.meta$ID_study)
##                                                               Coef. Estimate
## 1                                           type_publicationArticle    1.465
## 2                                        type_publicationConférence    3.702
## 3                                            type_publicationPoster    1.117
## 4                                             type_publicationThèse    1.556
## 5                 outcome_RDoCMixed social processes (non-adjusted)   -0.293
## 6          outcome_RDoCReception of facial communication (adjusted)   -1.036
## 7      outcome_RDoCReception of facial communication (non-adjusted)   -0.814
## 8      outcome_RDoCReception of non-facial communication (adjusted)   -0.996
## 9  outcome_RDoCReception of non-facial communication (non-adjusted)   -1.119
## 10               outcome_RDoCUnderstanding mental states (adjusted)   -0.737
## 11           outcome_RDoCUnderstanding mental states (non-adjusted)   -0.634
##       SE t-stat  d.f. p-val (Satt) Sig.
## 1  0.234   6.26  7.00      < 0.001  ***
## 2  0.243  15.22  8.21      < 0.001  ***
## 3  0.323   3.46  1.69      0.09368    .
## 4  0.262   5.94  9.69      < 0.001  ***
## 5  0.243  -1.21  8.21      0.26173     
## 6  0.238  -4.36  9.32      0.00169   **
## 7  0.247  -3.30  8.74      0.00959   **
## 8  0.383  -2.60  3.72      0.06431    .
## 9  0.270  -4.14 10.85      0.00168   **
## 10 0.267  -2.76  9.37      0.02118    *
## 11 0.242  -2.62  8.73      0.02862    *
ggplot(dat.borenstein, aes(x = type_publication, y = es)) + 
  geom_point(size = 3, alpha = 0.2) + 
  geom_boxplot() +
  theme_bw()

S5. Each facial emotion

Data analysis

dat.meta.S3 = subset(dat.meta, 
    emot_spec %in% c("Happy", "Sad", "Surprise", "Fear", "Disgust", "Anger") & 
      grepl("Reception of facial", dat.meta$outcome_RDoC, fixed = TRUE) & 
      !grepl("(adjusted)", dat.meta$outcome_RDoC, fixed = TRUE))

V.SCE.S3  <- with(dat.meta.S3,
  clubSandwich::impute_covariance_matrix(
    vi = se^2, 
    cluster = ID_study,
    r = 0.8,
    return_list = FALSE,
    smooth_vi = TRUE, 
    subgroup = emot_spec))

# all.equal(dat.meta$se^2, diag(unlist(V.SCE)))

SCE.S3 <- metafor::rma.mv(yi = es, V = V.SCE.S3, 
                       data = dat.meta.S3, 
                       mods = ~ emot_spec - 1,
                       random = ~ emot_spec | ID_study,
                       struct = "DIAG",
                       sparse = TRUE)

SCE.ISQ.S3 <- metafor::rma.mv(yi = es, V = V.SCE.S3, 
                               data = dat.meta.S3, 
                               mods = ~ emot_spec - 1)

res.SCE.S3 <- data.frame(clubSandwich::coef_test(SCE.S3, vcov = "CR2", cluster = dat.meta.S3$ID_study)) # , cluster = df.ES$researchgroup
res.SCE.ci.S3 = data.frame(clubSandwich::conf_int(SCE.S3, vcov = "CR2", cluster = dat.meta.S3$ID_study))
res.SCE.S3$emot_spec <- gsub("emot_spec", "", row.names(res.SCE.S3))
res.SCE.ci.S3$emot_spec <- gsub("emot_spec", "", row.names(res.SCE.ci.S3))
res.SCE.S3 = dplyr::left_join(res.SCE.S3, res.SCE.ci.S3)
## Joining, by = c("beta", "SE", "df", "emot_spec")
res.SCE.S3$I2 = het(SCE.S3, SCE.ISQ.S3)
res.SCE.clean.S3 = subset(res.SCE.S3, SE > 0.000001)

Table

dat_emot$emot_spec = dat_emot$nom_sousdim_clean
res_S3 <- left_join(res.SCE.clean.S3, dat_emot)
## Joining, by = "emot_spec"
res_S3[,c("beta", "SE", "tstat", "df", "p_Satt", "CI_L", "CI_U", "I2", "n_studies",    "n_nexp_out" , "n_exp_out")] <- apply(res_S3[,c("beta", "SE", "tstat", "df", "p_Satt", "CI_L", "CI_U", "I2", "n_studies",    "n_nexp_out" , "n_exp_out")], 2, function(x) round(x, 3))
DT::datatable(res_S3, 
              rownames = FALSE,
              options = list(  # options
                scrollX = TRUE,
                dom = c('ft'), 
                autoWidth = TRUE,
                columnDefs = list(
                  list(className = 'dt-center', 
                                     targets = "_all"))))

Forest plot

res_S3$raw_outcome <- gsub(r"{\s*\([^\)]+\)}","",
                            as.character(res_S3$nom_sousdim_clean))
tab.plot.S3 <- data.frame(
  Outcome = do.call(rbind, lapply(res_S3$nom_sousdim_clean, 
                                  function(x) paste(strwrap(x, width = 60), 
                                                    collapse = "\n"))),
  n_ADHD = res_S3$n_exp_out,
  n_nexpT = res_S3$n_nexp_out,
  n_studies = res_S3$n_studies,
  I2 = paste0(round(res_S3$I2), "%"))

value_num_plot_S3 = data.frame(apply(res_S3[, c("beta", "SE")], 2, function(x) as.numeric(as.character(x))))

forest_modif(x = value_num_plot_S3[ ,c("beta", "SE")], 
           variant = "classic",
           col = "Greys", xlab = "SMD", annotate_CI = TRUE,
           study_table = tab.plot.S3,
           group = res_S3$raw_outcome,
           type = "study_only",
           text_size = 3.5,
           x_limit = c(-1, 2),
           N = tab.plot.S3$n_ADHD + tab.plot.S3$n_nexpT,
           x_breaks = seq(-3, 3, 1)
           )

S6. Effect of age

a. Age

dat.meta.S6 = subset(dat.meta, !is.na(age) & outcome_RDoC %in% unique(synth_n$outcome_RDoC[synth_n$nstudy1 > 20]))
V.SCE.S6  <- with(dat.meta.S6,
  clubSandwich::impute_covariance_matrix(
    vi = se^2, 
    cluster = ID_study, 
    r = 0.8,
    return_list = FALSE,
    smooth_vi = TRUE, 
    subgroup = outcome_RDoC))


SCE.S6 <- metafor::rma.mv(yi = es, V = V.SCE.S6, 
                          data = dat.meta.S6, 
                          mods = ~ age * outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S6, vcov = "CR2", cluster = dat.meta.S6$ID_study)
##                                                              Coef. Estimate
## 1                                                          intrcpt  1.52428
## 2                                                              age -0.03170
## 3     outcome_RDoCReception of facial communication (non-adjusted) -0.66832
## 4           outcome_RDoCUnderstanding mental states (non-adjusted) -0.45345
## 5 age:outcome_RDoCReception of facial communication (non-adjusted)  0.01360
## 6       age:outcome_RDoCUnderstanding mental states (non-adjusted)  0.00994
##       SE  t-stat d.f. p-val (Satt) Sig.
## 1 0.8756  1.7408 18.0       0.0988    .
## 2 0.0845 -0.3749 15.7       0.7127     
## 3 1.0129 -0.6598 32.1       0.5141     
## 4 1.2157 -0.3730 35.0       0.7114     
## 5 0.0978  0.1391 26.6       0.8904     
## 6 0.1162  0.0856 30.8       0.9324
anova(SCE.S6, btt=5:6)
## 
## Test of Moderators (coefficients 5:6):
## QM(df = 2) = 0.1083, p-val = 0.9473
SCE.S6 <- metafor::rma.mv(yi = es, V = V.SCE.S6, 
                          data = dat.meta.S6, 
                          mods = ~ age + outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S6, vcov = "CR2", cluster = dat.meta.S6$ID_study)
##                                                          Coef. Estimate     SE
## 1                                                      intrcpt    1.446 0.4127
## 2                                                          age   -0.024 0.0388
## 3 outcome_RDoCReception of facial communication (non-adjusted)   -0.525 0.1076
## 4       outcome_RDoCUnderstanding mental states (non-adjusted)   -0.350 0.1083
##   t-stat d.f. p-val (Satt) Sig.
## 1   3.50 43.3      0.00108   **
## 2  -0.62 32.9      0.53974     
## 3  -4.88 80.0      < 0.001  ***
## 4  -3.23 98.3      0.00167   **
ggplot(dat.meta.S6, aes(x = age, y = es)) +
    facet_wrap(~outcome_RDoC) +
    geom_point(size = 2, alpha = 0.2) + 
    geom_smooth(method ="lm") +
    theme_bw()

b. Age diff

dat.meta.S6 = subset(dat.meta, !is.na(age_diff) & outcome_RDoC %in% unique(synth_n$outcome_RDoC[synth_n$nstudy1 > 20]))
V.SCE.S6  <- with(dat.meta.S6,
  clubSandwich::impute_covariance_matrix(
    vi = se^2, 
    cluster = ID_study, 
    r = 0.8,
    return_list = FALSE,
    smooth_vi = TRUE, 
    subgroup = outcome_RDoC))


SCE.S6 <- metafor::rma.mv(yi = es, V = V.SCE.S6, 
                          data = dat.meta.S6, 
                          mods = ~ age_diff * outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S6, vcov = "CR2", cluster = dat.meta.S6$ID_study)
##                                                                   Coef.
## 1                                                               intrcpt
## 2                                                              age_diff
## 3          outcome_RDoCReception of facial communication (non-adjusted)
## 4                outcome_RDoCUnderstanding mental states (non-adjusted)
## 5 age_diff:outcome_RDoCReception of facial communication (non-adjusted)
## 6       age_diff:outcome_RDoCUnderstanding mental states (non-adjusted)
##   Estimate     SE  t-stat   d.f. p-val (Satt) Sig.
## 1  1.19587 0.0771 15.5165  79.18      < 0.001  ***
## 2 -0.05634 0.2283 -0.2467   3.46      0.81906     
## 3 -0.52881 0.1111 -4.7599  81.86      < 0.001  ***
## 4 -0.35974 0.1099 -3.2733 100.11      0.00146   **
## 5 -0.05161 0.2483 -0.2079   5.39      0.84295     
## 6  0.00393 0.2578  0.0152   5.35      0.98840
anova(SCE.S6, btt=5:6)
## 
## Test of Moderators (coefficients 5:6):
## QM(df = 2) = 1.5728, p-val = 0.4555
SCE.S6 <- metafor::rma.mv(yi = es, V = V.SCE.S6, 
                          data = dat.meta.S6, 
                          mods = ~ age_diff + outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S6, vcov = "CR2", cluster = dat.meta.S6$ID_study)
##                                                          Coef. Estimate     SE
## 1                                                      intrcpt   1.1952 0.0747
## 2                                                     age_diff  -0.0671 0.0600
## 3 outcome_RDoCReception of facial communication (non-adjusted)  -0.5314 0.1088
## 4       outcome_RDoCUnderstanding mental states (non-adjusted)  -0.3589 0.1089
##   t-stat   d.f. p-val (Satt) Sig.
## 1  16.01  79.23      < 0.001  ***
## 2  -1.12   6.21      0.30543     
## 3  -4.88  82.71      < 0.001  ***
## 4  -3.30 100.08      0.00136   **
ggplot(dat.meta.S6, aes(x = age_diff, y = es)) +
    facet_wrap(~outcome_RDoC) +
    geom_point(size = 2, alpha = 0.2) + 
    geom_smooth() +
    theme_bw()

S7. Effect of comorbidities

a. ASD

dat.meta.S7_a = subset(dat.meta, !is.na(percentage_asd) & outcome_RDoC %in% unique(synth_n$outcome_RDoC[synth_n$nstudy1 > 20]) & percentage_asd %in% c(0,100))
dat.meta.S7_a$percentage_asd = factor(dat.meta.S7_a$percentage_asd)
V.SCE.S7_a  <- with(dat.meta.S7_a,
  clubSandwich::impute_covariance_matrix(
    vi = se^2, 
    cluster = ID_study, 
    r = 0.8,
    return_list = FALSE,
    smooth_vi = TRUE, 
    subgroup = outcome_RDoC))


SCE.S7_a <- metafor::rma.mv(yi = es, V = V.SCE.S7_a, 
                          data = dat.meta.S7_a, 
                          mods = ~ percentage_asd * outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S7_a, vcov = "CR2", cluster = dat.meta.S7_a$ID_study)
##                                                                            Coef.
## 1                                                                        intrcpt
## 2                                                              percentage_asd100
## 3                   outcome_RDoCReception of facial communication (non-adjusted)
## 4                         outcome_RDoCUnderstanding mental states (non-adjusted)
## 5 percentage_asd100:outcome_RDoCReception of facial communication (non-adjusted)
## 6       percentage_asd100:outcome_RDoCUnderstanding mental states (non-adjusted)
##   Estimate     SE t-stat  d.f. p-val (Satt) Sig.
## 1    1.334 0.0961  13.88 45.40      < 0.001  ***
## 2    1.059 0.2195   4.82  4.62      0.00588   **
## 3   -0.741 0.1387  -5.34 48.22      < 0.001  ***
## 4   -0.524 0.1413  -3.71 55.82      < 0.001  ***
## 5   -0.979 0.2187  -4.48  2.62      0.02760    *
## 6   -0.752 0.2507  -3.00  3.48      0.04775    *
anova(SCE.S7_a, btt=5:6)
## 
## Test of Moderators (coefficients 5:6):
## QM(df = 2) = 188.0490, p-val < .0001
SCE.S7_a_ph = metafor::rma.mv(yi = es, V = V.SCE.S7_a, 
                data = dat.meta.S7_a, 
                mods = ~ percentage_asd : outcome_RDoC - 1,
                random = ~ outcome_RDoC | ID_study,
                struct = "DIAG",
                sparse = TRUE)
SCE.S7_a_ph
## 
## Multivariate Meta-Analysis Model (k = 370; method: REML)
## 
## Variance Components:
## 
## outer factor: ID_study     (nlvls = 75)
## inner factor: outcome_RDoC (nlvls = 3)
## 
##             estim    sqrt  k.lvl  fixed 
## tau^2.1    0.3634  0.6029    120     no 
## tau^2.2    0.2168  0.4656    125     no 
## tau^2.3    0.2982  0.5461    125     no 
##                                                       level 
## tau^2.1               Mixed social processes (non-adjusted) 
## tau^2.2    Reception of facial communication (non-adjusted) 
## tau^2.3          Understanding mental states (non-adjusted) 
## 
## Test for Residual Heterogeneity:
## QE(df = 364) = 6209.0802, p-val < .0001
## 
## Test of Moderators (coefficients 1:6):
## QM(df = 6) = 803.2585, p-val < .0001
## 
## Model Results:
## 
##                                                                                 estimate 
## percentage_asd0:outcome_RDoCMixed social processes (non-adjusted)                 1.3335 
## percentage_asd100:outcome_RDoCMixed social processes (non-adjusted)               2.3924 
## percentage_asd0:outcome_RDoCReception of facial communication (non-adjusted)      0.5930 
## percentage_asd100:outcome_RDoCReception of facial communication (non-adjusted)    0.6728 
## percentage_asd0:outcome_RDoCUnderstanding mental states (non-adjusted)            0.8093 
## percentage_asd100:outcome_RDoCUnderstanding mental states (non-adjusted)          1.1162 
##                                                                                     se 
## percentage_asd0:outcome_RDoCMixed social processes (non-adjusted)               0.0963 
## percentage_asd100:outcome_RDoCMixed social processes (non-adjusted)             0.1062 
## percentage_asd0:outcome_RDoCReception of facial communication (non-adjusted)    0.1060 
## percentage_asd100:outcome_RDoCReception of facial communication (non-adjusted)  0.1204 
## percentage_asd0:outcome_RDoCUnderstanding mental states (non-adjusted)          0.1046 
## percentage_asd100:outcome_RDoCUnderstanding mental states (non-adjusted)        0.1158 
##                                                                                    zval 
## percentage_asd0:outcome_RDoCMixed social processes (non-adjusted)               13.8459 
## percentage_asd100:outcome_RDoCMixed social processes (non-adjusted)             22.5275 
## percentage_asd0:outcome_RDoCReception of facial communication (non-adjusted)     5.5963 
## percentage_asd100:outcome_RDoCReception of facial communication (non-adjusted)   5.5900 
## percentage_asd0:outcome_RDoCUnderstanding mental states (non-adjusted)           7.7342 
## percentage_asd100:outcome_RDoCUnderstanding mental states (non-adjusted)         9.6370 
##                                                                                   pval 
## percentage_asd0:outcome_RDoCMixed social processes (non-adjusted)               <.0001 
## percentage_asd100:outcome_RDoCMixed social processes (non-adjusted)             <.0001 
## percentage_asd0:outcome_RDoCReception of facial communication (non-adjusted)    <.0001 
## percentage_asd100:outcome_RDoCReception of facial communication (non-adjusted)  <.0001 
## percentage_asd0:outcome_RDoCUnderstanding mental states (non-adjusted)          <.0001 
## percentage_asd100:outcome_RDoCUnderstanding mental states (non-adjusted)        <.0001 
##                                                                                  ci.lb 
## percentage_asd0:outcome_RDoCMixed social processes (non-adjusted)               1.1448 
## percentage_asd100:outcome_RDoCMixed social processes (non-adjusted)             2.1843 
## percentage_asd0:outcome_RDoCReception of facial communication (non-adjusted)    0.3853 
## percentage_asd100:outcome_RDoCReception of facial communication (non-adjusted)  0.4369 
## percentage_asd0:outcome_RDoCUnderstanding mental states (non-adjusted)          0.6042 
## percentage_asd100:outcome_RDoCUnderstanding mental states (non-adjusted)        0.8892 
##                                                                                  ci.ub 
## percentage_asd0:outcome_RDoCMixed social processes (non-adjusted)               1.5223 
## percentage_asd100:outcome_RDoCMixed social processes (non-adjusted)             2.6006 
## percentage_asd0:outcome_RDoCReception of facial communication (non-adjusted)    0.8006 
## percentage_asd100:outcome_RDoCReception of facial communication (non-adjusted)  0.9087 
## percentage_asd0:outcome_RDoCUnderstanding mental states (non-adjusted)          1.0144 
## percentage_asd100:outcome_RDoCUnderstanding mental states (non-adjusted)        1.3432 
##  
## percentage_asd0:outcome_RDoCMixed social processes (non-adjusted)               *** 
## percentage_asd100:outcome_RDoCMixed social processes (non-adjusted)             *** 
## percentage_asd0:outcome_RDoCReception of facial communication (non-adjusted)    *** 
## percentage_asd100:outcome_RDoCReception of facial communication (non-adjusted)  *** 
## percentage_asd0:outcome_RDoCUnderstanding mental states (non-adjusted)          *** 
## percentage_asd100:outcome_RDoCUnderstanding mental states (non-adjusted)        *** 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
anova(SCE.S7_a_ph, L=c(-1,1,0,0,0,0))
## 
## Hypothesis:                                                                                                                                                
## 1: -percentage_asd0:outcome_RDoCMixed social processes (non-adjusted) + percentage_asd100:outcome_RDoCMixed social processes (non-adjusted) = 0 
## 
## Results:
##    estimate     se    zval   pval 
## 1:   1.0589 0.0499 21.2046 <.0001 
## 
## Test of Hypothesis:
## QM(df = 1) = 449.6367, p-val < .0001
anova(SCE.S7_a_ph, L=c(0,0,-1,1,0,0))
## 
## Hypothesis:                                                                                                                                                                      
## 1: -percentage_asd0:outcome_RDoCReception of facial communication (non-adjusted) + percentage_asd100:outcome_RDoCReception of facial communication (non-adjusted) = 0 
## 
## Results:
##    estimate     se   zval   pval 
## 1:   0.0799 0.0594 1.3451 0.1786 
## 
## Test of Hypothesis:
## QM(df = 1) = 1.8092, p-val = 0.1786
anova(SCE.S7_a_ph, L=c(0,0,0,0,-1,1))
## 
## Hypothesis:                                                                                                                                                          
## 1: -percentage_asd0:outcome_RDoCUnderstanding mental states (non-adjusted) + percentage_asd100:outcome_RDoCUnderstanding mental states (non-adjusted) = 0 
## 
## Results:
##    estimate     se   zval   pval 
## 1:   0.3069 0.0520 5.9048 <.0001 
## 
## Test of Hypothesis:
## QM(df = 1) = 34.8672, p-val < .0001
ggplot(dat.meta.S7_a, aes(x = percentage_asd, y = es)) +
    facet_wrap(~outcome_RDoC) +
    geom_point(size = 2, alpha = 0.2) + 
    geom_boxplot(alpha = 0.2) + 
    theme_bw()

b. ODD/CD

dat.meta.S7_b = subset(dat.meta, !is.na(percentage_cd_odd) & outcome_RDoC %in% unique(synth_n$outcome_RDoC[synth_n$nstudy1 > 20]))
dat.meta.S7_b$percentage_cd_odd = as.numeric(as.character(dat.meta.S7_b$percentage_cd_odd))
V.SCE.S7_b  <- with(dat.meta.S7_b,
  clubSandwich::impute_covariance_matrix(
    vi = se^2, 
    cluster = ID_study, 
    r = 0.8,
    return_list = FALSE,
    smooth_vi = TRUE, 
    subgroup = outcome_RDoC))


SCE.S7_b <- metafor::rma.mv(yi = es, V = V.SCE.S7_b, 
                          data = dat.meta.S7_b, 
                          mods = ~ percentage_cd_odd * outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S7_b, vcov = "CR2", cluster = dat.meta.S7_b$ID_study)
##                                                                            Coef.
## 1                                                                        intrcpt
## 2                                                              percentage_cd_odd
## 3                   outcome_RDoCReception of facial communication (non-adjusted)
## 4                         outcome_RDoCUnderstanding mental states (non-adjusted)
## 5 percentage_cd_odd:outcome_RDoCReception of facial communication (non-adjusted)
## 6       percentage_cd_odd:outcome_RDoCUnderstanding mental states (non-adjusted)
##   Estimate      SE t-stat  d.f. p-val (Satt) Sig.
## 1  1.20306 0.12806   9.39 35.39      < 0.001  ***
## 2  0.00375 0.00249   1.51  1.20      0.34286     
## 3 -0.53169 0.17011  -3.13 50.61      0.00294   **
## 4 -0.34179 0.16584  -2.06 50.36      0.04449    *
## 5 -0.00342 0.00292  -1.17  1.74      0.37765     
## 6 -0.00464 0.00267  -1.74  1.68      0.24759
anova(SCE.S7_b, btt=5:6)
## 
## Test of Moderators (coefficients 5:6):
## QM(df = 2) = 17.6356, p-val = 0.0001
SCE.S7_b_ph = metafor::rma.mv(yi = es, V = V.SCE.S7_b, 
                data = dat.meta.S7_b, 
                mods = ~ percentage_cd_odd : outcome_RDoC - 1,
                random = ~ outcome_RDoC | ID_study,
                struct = "DIAG",
                sparse = TRUE)
clubSandwich::coef_test(SCE.S7_b_ph, vcov = "CR2", cluster = dat.meta.S7_b$ID_study)
##                                                                            Coef.
## 1            percentage_cd_odd:outcome_RDoCMixed social processes (non-adjusted)
## 2 percentage_cd_odd:outcome_RDoCReception of facial communication (non-adjusted)
## 3       percentage_cd_odd:outcome_RDoCUnderstanding mental states (non-adjusted)
##    Estimate      SE t-stat d.f. p-val (Satt) Sig.
## 1  0.004140 0.00197  2.102 1.14        0.258     
## 2  0.000435 0.00153  0.285 2.25        0.800     
## 3 -0.000485 0.00103 -0.472 1.27        0.705
ggplot(dat.meta.S7_b, aes(x = percentage_cd_odd, y = es)) +
    facet_wrap(~outcome_RDoC) +
    geom_point(size = 2, alpha = 0.2) + 
    geom_smooth(method ="lm") +
    theme_bw()

S8. Effect of sex

dat.meta.S8 = subset(dat.meta, !is.na(sex) & outcome_RDoC %in% unique(synth_n$outcome_RDoC[synth_n$nstudy1 > 20]))
dat.meta.S8$sex = as.numeric(as.character(dat.meta.S8$sex))
dat.meta.S8$sex[dat.meta.S8$sex > 100] <- NA
V.SCE.S8  <- with(dat.meta.S8,
  clubSandwich::impute_covariance_matrix(
    vi = se^2, 
    cluster = ID_study, 
    r = 0.8,
    return_list = FALSE,
    smooth_vi = TRUE, 
    subgroup = outcome_RDoC))


SCE.S8 <- metafor::rma.mv(yi = es, V = V.SCE.S8, 
                          data = dat.meta.S8, 
                          mods = ~ sex * outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S8, vcov = "CR2", cluster = dat.meta.S8$ID_study)
##                                                              Coef. Estimate
## 1                                                          intrcpt  1.35547
## 2                                                              sex -0.00549
## 3     outcome_RDoCReception of facial communication (non-adjusted) -0.73378
## 4           outcome_RDoCUnderstanding mental states (non-adjusted) -0.50688
## 5 sex:outcome_RDoCReception of facial communication (non-adjusted)  0.00599
## 6       sex:outcome_RDoCUnderstanding mental states (non-adjusted)  0.00456
##        SE t-stat  d.f. p-val (Satt) Sig.
## 1 0.18258  7.424 26.64       <0.001  ***
## 2 0.00615 -0.892  5.54       0.4093     
## 3 0.27675 -2.651 19.85       0.0154    *
## 4 0.23447 -2.162 28.07       0.0393    *
## 5 0.01019  0.588  9.10       0.5708     
## 6 0.00726  0.627 10.31       0.5440
anova(SCE.S8, btt=5:6)
## 
## Test of Moderators (coefficients 5:6):
## QM(df = 2) = 2.2717, p-val = 0.3211
SCE.S8 <- metafor::rma.mv(yi = es, V = V.SCE.S8, 
                          data = dat.meta.S8, 
                          mods = ~ sex + outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S8, vcov = "CR2", cluster = dat.meta.S8$ID_study)
##                                                          Coef. Estimate      SE
## 1                                                      intrcpt  1.30381 0.13687
## 2                                                          sex -0.00365 0.00434
## 3 outcome_RDoCReception of facial communication (non-adjusted) -0.57444 0.11693
## 4       outcome_RDoCUnderstanding mental states (non-adjusted) -0.38940 0.11216
##   t-stat d.f. p-val (Satt) Sig.
## 1   9.53 52.6       <0.001  ***
## 2  -0.84 10.8        0.419     
## 3  -4.91 65.7       <0.001  ***
## 4  -3.47 88.6       <0.001  ***
ggplot(dat.meta.S8, aes(x = sex, y = es)) +
    facet_wrap(~outcome_RDoC) +
    geom_point(size = 2, alpha = 0.2) + 
    geom_smooth(method ="lm") +
    theme_bw()

S9. Effect of IQ

a. IQ

dat.meta.S9 = subset(dat.meta, !is.na(iq) & outcome_RDoC %in% unique(synth_n$outcome_RDoC[synth_n$nstudy1 > 20]))
dat.meta.S9$iq = as.numeric(as.character(dat.meta.S9$iq))
# dat.meta.S9$iq[dat.meta.S9$iq > 100] <- NA
V.SCE.S9  <- with(dat.meta.S9,
  clubSandwich::impute_covariance_matrix(
    vi = se^2, 
    cluster = ID_study, 
    r = 0.8,
    return_list = FALSE,
    smooth_vi = TRUE, 
    subgroup = outcome_RDoC))


SCE.S9 <- metafor::rma.mv(yi = es, V = V.SCE.S9, 
                          data = dat.meta.S9, 
                          mods = ~ iq * outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S9, vcov = "CR2", cluster = dat.meta.S9$ID_study)
##                                                             Coef. Estimate
## 1                                                         intrcpt -0.74569
## 2                                                              iq  0.01922
## 3    outcome_RDoCReception of facial communication (non-adjusted)  2.00949
## 4          outcome_RDoCUnderstanding mental states (non-adjusted) -0.80599
## 5 iq:outcome_RDoCReception of facial communication (non-adjusted) -0.02588
## 6       iq:outcome_RDoCUnderstanding mental states (non-adjusted)  0.00242
##       SE  t-stat d.f. p-val (Satt) Sig.
## 1 7.1471 -0.1043 5.69        0.920     
## 2 0.0687  0.2797 5.83        0.789     
## 3 7.4170  0.2709 8.09        0.793     
## 4 9.2142 -0.0875 5.40        0.933     
## 5 0.0712 -0.3633 8.12        0.726     
## 6 0.0884  0.0273 5.28        0.979
anova(SCE.S9, btt=5:6)
## 
## Test of Moderators (coefficients 5:6):
## QM(df = 2) = 2.1447, p-val = 0.3422
SCE.S9 <- metafor::rma.mv(yi = es, V = V.SCE.S9, 
                          data = dat.meta.S9, 
                          mods = ~ iq + outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S9, vcov = "CR2", cluster = dat.meta.S9$ID_study)
##                                                          Coef. Estimate     SE
## 1                                                      intrcpt  -0.2311 3.9819
## 2                                                           iq   0.0143 0.0384
## 3 outcome_RDoCReception of facial communication (non-adjusted)  -0.6723 0.1555
## 4       outcome_RDoCUnderstanding mental states (non-adjusted)  -0.5485 0.1374
##   t-stat  d.f. p-val (Satt) Sig.
## 1 -0.058  9.70        0.955     
## 2  0.372  9.74        0.718     
## 3 -4.323 40.90       <0.001  ***
## 4 -3.991 45.07       <0.001  ***
ggplot(dat.meta.S9, aes(x = iq, y = es)) +
    facet_wrap(~outcome_RDoC) +
    geom_point(size = 2, alpha = 0.2) + 
    geom_smooth(method ="lm") +
    theme_bw()

b. IQ diff

dat.meta.S9 = subset(dat.meta, !is.na(iq_diff) & outcome_RDoC %in% unique(synth_n$outcome_RDoC[synth_n$nstudy1 > 20]))
dat.meta.S9$iq_diff = as.numeric(as.character(dat.meta.S9$iq_diff))


SCE.S9 <- metafor::rma.mv(yi = es, V = V.SCE.S9, 
                          data = dat.meta.S9, 
                          mods = ~ iq_diff * outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S9, vcov = "CR2", cluster = dat.meta.S9$ID_study)
##                                                                  Coef. Estimate
## 1                                                              intrcpt  1.34865
## 2                                                              iq_diff  0.01092
## 3         outcome_RDoCReception of facial communication (non-adjusted) -0.79154
## 4               outcome_RDoCUnderstanding mental states (non-adjusted) -0.53943
## 5 iq_diff:outcome_RDoCReception of facial communication (non-adjusted) -0.01467
## 6       iq_diff:outcome_RDoCUnderstanding mental states (non-adjusted)  0.00258
##       SE  t-stat  d.f. p-val (Satt) Sig.
## 1 0.4013  3.3608 29.78      0.00215   **
## 2 0.0434  0.2517  5.44      0.81054     
## 3 0.4120 -1.9213 35.73      0.06269    .
## 4 0.4730 -1.1403 33.53      0.26223     
## 5 0.0461 -0.3180  3.31      0.76950     
## 6 0.0539  0.0479  5.86      0.96336
anova(SCE.S9, btt=5:6)
## 
## Test of Moderators (coefficients 5:6):
## QM(df = 2) = 1.8788, p-val = 0.3909
SCE.S9 <- metafor::rma.mv(yi = es, V = V.SCE.S9, 
                          data = dat.meta.S9, 
                          mods = ~ iq_diff + outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S9, vcov = "CR2", cluster = dat.meta.S9$ID_study)
##                                                          Coef. Estimate     SE
## 1                                                      intrcpt  1.33590 0.2554
## 2                                                      iq_diff  0.00947 0.0245
## 3 outcome_RDoCReception of facial communication (non-adjusted) -0.72144 0.1925
## 4       outcome_RDoCUnderstanding mental states (non-adjusted) -0.55459 0.1391
##   t-stat  d.f. p-val (Satt) Sig.
## 1  5.231 33.20       <0.001  ***
## 2  0.387  8.54        0.708     
## 3 -3.747 41.13       <0.001  ***
## 4 -3.988 44.95       <0.001  ***
ggplot(dat.meta.S9, aes(x = iq_diff, y = es)) +
    facet_wrap(~outcome_RDoC) +
    geom_point(size = 2, alpha = 0.2) + 
    geom_smooth(method ="lm") +
    theme_bw()

S10. Effect of rob

dat.meta.S10 = subset(dat.meta, !is.na(rob_tot) & outcome_RDoC %in% unique(synth_n$outcome_RDoC[synth_n$nstudy1 > 20]))
V.SCE.S10  <- with(dat.meta.S10,
  clubSandwich::impute_covariance_matrix(
    vi = se^2, 
    cluster = ID_study, 
    r = 0.8,
    return_list = FALSE,
    smooth_vi = TRUE, 
    subgroup = outcome_RDoC))


SCE.S10 <- metafor::rma.mv(yi = es, V = V.SCE.S10, 
                          data = dat.meta.S10, 
                          mods = ~ rob_tot * outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S10, vcov = "CR2", cluster = dat.meta.S10$ID_study)
##                                                                  Coef. Estimate
## 1                                                              intrcpt   0.8151
## 2                                                              rob_tot   0.0662
## 3         outcome_RDoCReception of facial communication (non-adjusted)  -0.7100
## 4               outcome_RDoCUnderstanding mental states (non-adjusted)  -0.0865
## 5 rob_tot:outcome_RDoCReception of facial communication (non-adjusted)   0.0216
## 6       rob_tot:outcome_RDoCUnderstanding mental states (non-adjusted)  -0.0492
##       SE t-stat  d.f. p-val (Satt) Sig.
## 1 0.1391  5.861  5.04       0.0020   **
## 2 0.0213  3.103  3.86       0.0379    *
## 3 0.3714 -1.912 19.93       0.0704    .
## 4 0.2654 -0.326  4.79       0.7584     
## 5 0.0624  0.347 18.45       0.7326     
## 6 0.0409 -1.203  3.95       0.2962
anova(SCE.S10, btt=5:6)
## 
## Test of Moderators (coefficients 5:6):
## QM(df = 2) = 1.6206, p-val = 0.4447
SCE.S10 <- metafor::rma.mv(yi = es, V = V.SCE.S10, 
                          data = dat.meta.S10, 
                          mods = ~ rob_tot + outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S10, vcov = "CR2", cluster = dat.meta.S10$ID_study)
##                                                          Coef. Estimate     SE
## 1                                                      intrcpt   0.8924 0.1149
## 2                                                      rob_tot   0.0529 0.0162
## 3 outcome_RDoCReception of facial communication (non-adjusted)  -0.5674 0.1038
## 4       outcome_RDoCUnderstanding mental states (non-adjusted)  -0.3914 0.1076
##   t-stat  d.f. p-val (Satt) Sig.
## 1   7.77  8.49       <0.001  ***
## 2   3.26  5.16       0.0215    *
## 3  -5.47 82.30       <0.001  ***
## 4  -3.64 96.23       <0.001  ***
ggplot(dat.meta.S10, aes(x = rob_tot, y = es)) +
    facet_wrap(~outcome_RDoC) +
    geom_point(size = 2, alpha = 0.2) + 
    geom_smooth() + #method ="lm"
    theme_bw()

S11. Type of tools

dat.meta.S11 = subset(dat.meta, !is.na(type_mesure) & outcome_RDoC== "Understanding mental states (non-adjusted)")
dat.meta.S11$vi = dat.meta.S11$se^2
dat.meta.S11$es_id = 1:nrow(dat.meta.S11)
SCE.S11 <- metafor::rma.mv(yi = es, V = vi, 
                          data = dat.meta.S11, 
                          mods = ~ type_mesure ,
                          random = ~ 1 | ID_study/es_id)

metafor::rma.mv(yi = es, V = vi, 
                          data = dat.meta.S11, 
                          mods = ~ type_mesure - 1,
                          random = ~ 1 | ID_study/es_id)
## 
## Multivariate Meta-Analysis Model (k = 186; method: REML)
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed          factor 
## sigma^2.1  0.2319  0.4816     56     no        ID_study 
## sigma^2.2  0.1641  0.4051    186     no  ID_study/es_id 
## 
## Test for Residual Heterogeneity:
## QE(df = 184) = 1026.5716, p-val < .0001
## 
## Test of Moderators (coefficients 1:2):
## QM(df = 2) = 112.2219, p-val < .0001
## 
## Model Results:
## 
##                      estimate      se    zval    pval   ci.lb   ci.ub 
## type_mesureParadigm    0.7539  0.0819  9.2007  <.0001  0.5933  0.9145  *** 
## type_mesureReport      1.0250  0.1322  7.7512  <.0001  0.7658  1.2841  *** 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
ggplot(dat.meta.S11, aes(x = type_mesure, y = es)) +
    facet_wrap(~outcome_RDoC) +
    geom_point(size = 2, alpha = 0.2) + 
    geom_boxplot(alpha = 0.2) + 
    geom_smooth() + #method ="lm"
    theme_bw()

S12. Sous type TDAH

a. Inattentive

dat.meta.S12.a = subset(dat.meta, !is.na(percentage_inattentive) & outcome_RDoC %in% unique(synth_n$outcome_RDoC[synth_n$nstudy1 > 20]))
dat.meta.S12.a$percentage_inattentive = as.numeric(as.character(dat.meta.S12.a$percentage_inattentive))
V.SCE.S12.a  <- with(dat.meta.S12.a,
  clubSandwich::impute_covariance_matrix(
    vi = se^2, 
    cluster = ID_study, 
    r = 0.8,
    return_list = FALSE,
    smooth_vi = TRUE, 
    subgroup = outcome_RDoC))


SCE.S12.a <- metafor::rma.mv(yi = es, V = V.SCE.S12.a, 
                          data = dat.meta.S12.a, 
                          mods = ~ percentage_inattentive * outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S12.a, vcov = "CR2", cluster = dat.meta.S12.a$ID_study)
##                                                                                 Coef.
## 1                                                                             intrcpt
## 2                                                              percentage_inattentive
## 3                        outcome_RDoCReception of facial communication (non-adjusted)
## 4                              outcome_RDoCUnderstanding mental states (non-adjusted)
## 5 percentage_inattentive:outcome_RDoCReception of facial communication (non-adjusted)
## 6       percentage_inattentive:outcome_RDoCUnderstanding mental states (non-adjusted)
##    Estimate       SE  t-stat  d.f. p-val (Satt) Sig.
## 1  1.33e+00 0.113394 11.6994 33.72      < 0.001  ***
## 2 -2.86e-03 0.000694 -4.1223  1.13      0.12853     
## 3 -5.51e-01 0.204848 -2.6877 14.62      0.01716    *
## 4 -4.71e-01 0.168153 -2.8035 41.71      0.00764   **
## 5 -7.52e-05 0.005913 -0.0127  8.43      0.99016     
## 6  3.66e-03 0.000899  4.0779  1.12      0.13266
anova(SCE.S12.a, btt=5:6)
## 
## Test of Moderators (coefficients 5:6):
## QM(df = 2) = 33.4423, p-val < .0001
SCE.S12.a <- metafor::rma.mv(yi = es, V = V.SCE.S12.a, 
                          data = dat.meta.S12.a, 
                          mods = ~ percentage_inattentive:outcome_RDoC - 1,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S12.a, vcov = "CR2", cluster = dat.meta.S12.a$ID_study)
##                                                                                 Coef.
## 1            percentage_inattentive:outcome_RDoCMixed social processes (non-adjusted)
## 2 percentage_inattentive:outcome_RDoCReception of facial communication (non-adjusted)
## 3       percentage_inattentive:outcome_RDoCUnderstanding mental states (non-adjusted)
##    Estimate       SE t-stat d.f. p-val (Satt) Sig.
## 1 -0.002799 0.000796  -3.52 1.13       0.1538     
## 2  0.013239 0.005376   2.46 7.34       0.0418    *
## 3  0.000975 0.000331   2.95 1.05       0.1993
ggplot(dat.meta.S12.a, aes(x = percentage_inattentive, y = es)) +
    facet_wrap(~outcome_RDoC) +
    geom_point(size = 2, alpha = 0.2) + 
    geom_smooth(method ="lm") +
    theme_bw()

b. Hyperactive

dat.meta.S12.b = subset(dat.meta, !is.na(percentage_hyperactive) & outcome_RDoC %in% unique(synth_n$outcome_RDoC[synth_n$nstudy1 > 20]))
dat.meta.S12.b$percentage_hyperactive = as.numeric(as.character(dat.meta.S12.b$percentage_hyperactive))
V.SCE.S12.b  <- with(dat.meta.S12.b,
  clubSandwich::impute_covariance_matrix(
    vi = se^2, 
    cluster = ID_study, 
    r = 0.8,
    return_list = FALSE,
    smooth_vi = TRUE, 
    subgroup = outcome_RDoC))


SCE.S12.b <- metafor::rma.mv(yi = es, V = V.SCE.S12.b, 
                          data = dat.meta.S12.b, 
                          mods = ~ percentage_hyperactive * outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S12.b, vcov = "CR2", cluster = dat.meta.S12.b$ID_study)
##                                                                                 Coef.
## 1                                                                             intrcpt
## 2                                                              percentage_hyperactive
## 3                        outcome_RDoCReception of facial communication (non-adjusted)
## 4                              outcome_RDoCUnderstanding mental states (non-adjusted)
## 5 percentage_hyperactive:outcome_RDoCReception of facial communication (non-adjusted)
## 6       percentage_hyperactive:outcome_RDoCUnderstanding mental states (non-adjusted)
##    Estimate     SE t-stat  d.f. p-val (Satt) Sig.
## 1  1.260673 0.1580  7.980 32.46      < 0.001  ***
## 2  0.000806 0.0106  0.076  1.16      0.95043     
## 3 -0.606758 0.2032 -2.986 35.80      0.00508   **
## 4 -0.432361 0.2143 -2.017 40.58      0.05030    .
## 5  0.003804 0.0120  0.317  1.61      0.78777     
## 6  0.006232 0.0195  0.320  1.94      0.77986
anova(SCE.S12.b, btt=5:6)
## 
## Test of Moderators (coefficients 5:6):
## QM(df = 2) = 2.6689, p-val = 0.2633
SCE.S12.b <- metafor::rma.mv(yi = es, V = V.SCE.S12.b, 
                          data = dat.meta.S12.b, 
                          mods = ~ percentage_hyperactive+outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S12.b, vcov = "CR2", cluster = dat.meta.S12.b$ID_study)
##                                                          Coef. Estimate      SE
## 1                                                      intrcpt  1.25130 0.13738
## 2                                       percentage_hyperactive  0.00177 0.00721
## 3 outcome_RDoCReception of facial communication (non-adjusted) -0.57187 0.16799
## 4       outcome_RDoCUnderstanding mental states (non-adjusted) -0.38319 0.16789
##   t-stat  d.f. p-val (Satt) Sig.
## 1  9.108 32.74      < 0.001  ***
## 2  0.246  1.52      0.83505     
## 3 -3.404 39.13      0.00155   **
## 4 -2.282 42.43      0.02754    *
ggplot(dat.meta.S12.b, aes(x = percentage_hyperactive, y = es)) +
    facet_wrap(~outcome_RDoC) +
    geom_point(size = 2, alpha = 0.2) + 
    geom_smooth(method ="lm") +
    theme_bw()

c. Combined

dat.meta.S12.c = subset(dat.meta, !is.na(percentage_combined) & outcome_RDoC %in% unique(synth_n$outcome_RDoC[synth_n$nstudy1 > 20]))
dat.meta.S12.c$percentage_combined = as.numeric(as.character(dat.meta.S12.c$percentage_combined))
V.SCE.S12.c  <- with(dat.meta.S12.c,
  clubSandwich::impute_covariance_matrix(
    vi = se^2, 
    cluster = ID_study, 
    r = 0.8,
    return_list = FALSE,
    smooth_vi = TRUE, 
    subgroup = outcome_RDoC))


SCE.S12.c <- metafor::rma.mv(yi = es, V = V.SCE.S12.c, 
                          data = dat.meta.S12.c, 
                          mods = ~ percentage_combined * outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S12.c, vcov = "CR2", cluster = dat.meta.S12.c$ID_study)
##                                                                              Coef.
## 1                                                                          intrcpt
## 2                                                              percentage_combined
## 3                     outcome_RDoCReception of facial communication (non-adjusted)
## 4                           outcome_RDoCUnderstanding mental states (non-adjusted)
## 5 percentage_combined:outcome_RDoCReception of facial communication (non-adjusted)
## 6       percentage_combined:outcome_RDoCUnderstanding mental states (non-adjusted)
##   Estimate       SE t-stat  d.f. p-val (Satt) Sig.
## 1  1.06028 0.129159  8.209 31.17       <0.001  ***
## 2  0.00298 0.000578  5.153  1.06       0.1111     
## 3 -0.26176 0.339581 -0.771  7.55       0.4643     
## 4 -0.12496 0.182378 -0.685 37.05       0.4975     
## 5 -0.00462 0.004235 -1.090  7.46       0.3097     
## 6 -0.00389 0.000623 -6.232  1.12       0.0831    .
anova(SCE.S12.c, btt=5:6)
## 
## Test of Moderators (coefficients 5:6):
## QM(df = 2) = 38.0173, p-val < .0001
SCE.S12.c <- metafor::rma.mv(yi = es, V = V.SCE.S12.c, 
                          data = dat.meta.S12.c, 
                          mods = ~ percentage_combined+outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S12.c, vcov = "CR2", cluster = dat.meta.S12.c$ID_study)
##                                                          Coef. Estimate
## 1                                                      intrcpt  1.15582
## 2                                          percentage_combined  0.00153
## 3 outcome_RDoCReception of facial communication (non-adjusted) -0.55806
## 4       outcome_RDoCUnderstanding mental states (non-adjusted) -0.36543
##         SE t-stat  d.f. p-val (Satt) Sig.
## 1 0.123545   9.36 32.70      < 0.001  ***
## 2 0.000438   3.50  1.13      0.15451     
## 3 0.166053  -3.36 39.26      0.00174   **
## 4 0.169493  -2.16 42.64      0.03677    *
ggplot(dat.meta.S12.c, aes(x = percentage_combined, y = es)) +
    facet_wrap(~outcome_RDoC) +
    geom_point(size = 2, alpha = 0.2) + 
    geom_smooth(method ="lm") +
    theme_bw()